<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <!-- <script async defer></script> -->

</head>

<body>
    <script>
        // 概念题  25分
        // 1.JS的命名规范有哪些？ JS的引入方式方式有哪些？如何延迟JS的加载？
        // 答： 驼峰命名法 content_left contentLeft 不能以数字开头 不起var等来命名变量 页外引入 页内引入 行内引入 将js放在内容之后

        // 2.什么是作用域?有多少种作用域?怎么区分？什么是作用域链?
        // 答：函数作用域 和 块级作用域  作业域链是嵌套函数所产生的 由里到外
        // 3.JavaScript 的数据类型有哪些？并如何进行数据类型的判断？
        // 答：字符串 布尔值 null undefined 数字 array object function symbol    typeof 无法判断 object array function   Object.prototype.toString.call()
        // 4.null 和 undefined 的区别 和 == 和 === 的区别 ？
        // 答：null是对空对象的引用  undefined是声明未赋值  == 值相等即可 会进行类型转换 === 值相等 类型也要相等 不会进行类型转换
        // 5.使用 continue 或 break 终止循环时，两种方式的区别是？
        // 答：break是跳出循环 continue则是跳出循环继续迭代

        // 输出类型题  25分
        // 1.请写出下列输出结果，并说明原因。
        for (var i = 0; i < 5; i++) {
            setTimeout(function() {
                console.log(i);
            }, 0);
        } // 打印5次5  for循环完后生成5个定时器 最后i=5； 

        // 2.请写出下列输出结果，并说明原因。
        console.log(a); // undefined 命名未赋值
        var a = 12;

        function fn() {
            console.log(a); // 12   var a = 12;
            a = 13;
        }
        fn();
        console.log(a); // 12 var a = 13;


        // 3.请写出下列输出结果，并说明原因。
        var a = 1;
        var obj = {
            name: "tom",
        };

        function fn() {
            var a2 = a;
            obj2 = obj;
            a2 = a;
            obj2.name = "jack";
        }
        fn();
        console.log(a); // 1 块级作用域对全局变量 var a = 1; 没有影响
        console.log(obj); // {name: "jack"} obj2 = obj; obj2 与 obj 是同一个地址 同时修改

        // 4.请写出下列输出结果，并说明原因。
        var a = 1;

        function fn(a) {
            console.log(a); // ƒ a() {}  var 和 函数在一起会失效
            var a = 2;

            function a() {}
        }
        fn(a);

        // 5.请写出下列输出结果，并说明原因。
        const length = 4;
        const numbers = [];
        for (var i = 0; i < length; i++); {
            numbers.push(i + 1); // 空循环
        }

        console.log(numbers); // [5] 

        // 编程题  50分
        // 1.判断一个字符串中出现次数最多的字符，统计这个次数
        let str = "abcccccdeedssse";
        let newObj = {};
        let max = 0;
        let maxStr = '';
        for (let i = 0; i < str.length; i++) {
            if (newObj[str[i]]) {
                newObj[str[i]] += 1;
            } else {
                newObj[str[i]] = 1;
            }
            for (key in newObj) {
                if (newObj[key] > max) {
                    max = newObj[key];
                    maxStr = key;
                }
            }
        }
        console.log(maxStr, max);

        // 2.数组去重？（2种方法以上）
        let arr = [1, 2, 3, 1, 1, 1, 1, 2, 3];
        let arrTwo = [];
        for (let i = 0; i < arr.length; i++) {
            if (arrTwo.indexOf(arr[i]) == -1) {
                arrTwo.push(arr[i]);
            }
        }
        console.log(arrTwo);

        for (let i = 0; i < arr.length; i++) {
            for (let j = i + 1; j < arr.length; j++) {
                if (arr[i] == arr[j]) {
                    arr.splice(j, 1);
                    j--;
                }
            }
        }
        console.log(arr);

        // 3.找出数组中重复出现过的元素.
        let arr1 = [1, 2, 3, "alex", 4, "alex", 2, 4, "alex"];
        let newArr = [];
        let newArr2 = [];
        for (let i = 0; i < arr1.length; i++) {
            for (let j = i + 1; j < arr1.length; j++) {
                if (arr1[i] == arr1[j]) {
                    newArr.push(arr1[i]);
                }
            }
        };
        for (let k = 0; k < newArr.length; k++) {
            if (newArr2.indexOf(newArr[k]) == -1) {
                newArr2.push(newArr[k]);
            }
        };
        console.log(newArr2);
        // 4.找出数组中年龄小于18岁的女生的信息重新组成新的数组,并且将她们count变为现有的平方（10）
        let arr2 = [{
            name: "111",
            sex: "boy",
            age: 18,
            count: 20
        }, {
            name: "222",
            sex: "girl",
            age: 17,
            count: 30
        }, {
            name: "333",
            sex: "boy",
            age: 16,
            count: 40
        }, {
            name: "444",
            sex: "girl",
            age: 15,
            count: 50
        }, {
            name: "555",
            sex: "boy",
            age: 20,
            count: 60
        }, {
            name: "666",
            sex: "girl",
            age: 13,
            count: 70
        }, {
            name: "777",
            sex: "boy",
            age: 14,
            count: 80
        }, ];
        var newArr4 = arr2.filter(function(ele) {
            return ele.age < 18;
        });
        console.log(newArr);
        var newArr5 = newArr4.map(function(ele) {
            return ele.count * 10;
        })
        console.log(newArr5);
        // 5.深浅拷贝的原理是什么？请你写出具体的解决代码。
        function dp(data) {
            if (Array.isArray(data)) {
                let result = [];
                for (let i = 0; i < data.length; i++) {
                    result.push(dp(data[i]));
                }
            } else if (typeof data == 'object') {
                let result = {};
                for (key in data) {
                    result[key] = dp(data[key])
                }
            } else {
                var result = data;
            };
            return result;
        }

        // 提高加分：
        // 问题：a是什么的时候，可以满足下列条件，输出1
        // var a = ?
        //  if (a == 1 && a == 2 && a == 3) {
        //    console.log(1);
        //  }

        var a = {
            i: 1,
            toString: function() {
                return a.i++
            }
        }
    </script>
</body>

</html>